package com.cskaoyan.javase.thread._4synchronized._1impl.exercise;
/**
 * 多线程线程同步代码演示
 * @since 16:27
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    // 定义一把锁
    private static final Object OBJECT = new Object();
    public static void main(String[] args) {
        // 创建并启动A线程
        new Thread(() -> {
            System.out.println("A线程开始执行!");
            for (int i = 0; i < 30; i++) {
                // 使用同步代码块,定义一个原子操作
                synchronized (OBJECT) {
                    System.out.println("A线程第" + (i + 1) + "次拿到了锁对象!");
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("A线程第" + (i + 1) + "次释放锁对象!");
                }
            }
            System.out.println("A线程执行完毕!");
        }).start();

        // 主线程休眠1秒钟,这样可以大概率保证A线程先执行
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 创建并启动B线程
        new Thread(() -> {
            System.out.println("B线程开始执行!");
            // 注意要使用同一把锁
            synchronized (OBJECT) {
                System.out.println("B线程拿到锁对象!");
                try {
                    // 休眠一秒钟
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("B线程释放锁对象!");
            }
            System.out.println("B线程执行完毕!");
        }).start();
    }
}